
//加载crypto模块，对数据进行加密
var crypto=require('crypto');
//加载user模块，进行登录、注册
var User=require('../models/user');
//加载Post模块，进行发表文章等功能
var Post=require('../models/post');
//加载Comment模块，进行评论
var Comment=require('../models/comment');
//加载Perinfo模块
var Perinfo=require('../models/perInfo');
//加载心情日记的类
var Xinfeng=require('../models/xinfeng');
//加载晚完善信息的类
var Wanshan=require('../models/wanshan');
//加载最近登陆的用户
var Fangke=require('../models/fangke');
//加载上传功能
var multer=require('multer');
//配置上传信息
var storage=multer.diskStorage({
    // 如果路径设置为函数，就需要你手动创建，如果是设置的字符串，系统会自动创建
    destination:'public/userFile',//系统自动创建的文件名
    //必须自己创建的文件名
    // destination:function (req,file,cb) {
    //     cb(null,'./public/userFile');
    // },
    filename:function (req,file,cb) {
        //以用户名进行命名
        cb(null,req.session.user.name+'.jpg');
    }
});
var upload=multer({
    storage:storage,
    // 设置文件大小不能超过1000*1024
    fileSize:1000*1024
});

//设置权限函数
function checkLogin(req,res,next) {
    //未登录
    if(!req.session.user){
        req.flash('error','未登录');
        return res.redirect('/loginForm');
    }
    next();
}
function checkNotLogin(req,res,next) {
    //已登录
    if(req.session.user){
        req.flash('error','已登录');
        //返回上一级页面
        return res.redirect('/main');
    }
    next();
}
module.exports=function (app) {
    //注册页面
    app.get('/',function (req,res) {
        res.render('index',{
            title:'注册',
            user:req.session.user,
            success:req.flash('success').toString(),
            error:req.flash('error').toString()
        })
    })
    //同样是注册页面
    app.get('/regForm',checkNotLogin);
    app.get('/regForm',function (req,res) {
        res.render('index',{
            title:'注册',
            user:req.session.user,
            success:req.flash('success').toString(),
            error:req.flash('error').toString()
        })
    })
    //登录页面
    app.get('/loginForm',checkNotLogin);
    app.get('/loginForm',function (req,res) {
        res.render('loginForm',{
            title:'登录',
            user:req.session.user,
            success:req.flash('success').toString(),
            error:req.flash('error').toString()
        })
    })
    //注册逻辑
    app.post('/regAction',checkNotLogin);
   app.post('/regAction',function (req,res) {
       var name=req.body.name;
       var password=req.body.password;
       var passwordRep=req.body['password-repeat'];
       var email=req.body.email;
        //判断两次密码是否相等
       if(password!=passwordRep){
            req.flash('error','两次密码不一致');
            return res.redirect('/');
       }
       //对密码进行加密,再存入数据库
       var md5=crypto.createHash('md5');
       var password=md5.update(req.body.password).digest('hex');
       //查询应户名是否存在
       User.get(name,function (err,user) {
           if(err){
                req.flash('error',err);
                return res.redirect('/');
           }
           //用户已经存在
           if(user){
                req.flash('error','用户已经存在');
                return res.redirect('/');
           }
           //将用户信息写到数据库中
            var newUser=new User(name,password,email);
           newUser.save(function (err) {
               if(err){
                   req.flash('error',err);
                   return res.redirect('/');
               }
               //保存信息成功
               req.session.user=newUser;
               req.flash('success','注册成功');
               return res.redirect('/main')
           })
       })
   });
    //登录的逻辑
    app.post('/loginAction',checkNotLogin);
    app.post('/loginAction',function (req,res) {
        var name=req.body.name;
        var password=req.body.password;
        //对密码加密
        var md5=crypto.createHash('md5');
        var password=md5.update(req.body.password).digest('hex');
        //判断用户名是否存在
        User.get(name,function (err,user) {
            if(err){
                req.flash('error',err);
                return res.redirect('/loginForm');
            }
            //如果用户不存在
            if(!user){
                req.flash('error','用户名不存在');
                return res.redirect('/loginForm');
            }
            //检查密码是否一致
            if(user.password!=password){
                req.flash('error','密码不正确');
                return res.redirect('/loginForm');
            }
            //登录成功
            //保存最近登录的用户
            var fangke=new Fangke(name);
            fangke.save(function (err) {
                if(err){
                    req.flash('error',err);
                    return res.redirect('/loginForm');
                }
                //保存成功
            });
            //延时500ms执行，否则需要手动刷新才可以显示文章
            setTimeout(function () {
                req.session.user=user;
                req.flash('success','登陆成功');
                return res.redirect('/main');
            },500)
        })
    })

    //退出逻辑
    app.get('/logout',checkLogin);
    app.get('/logout',function (req,res) {
        req.session.user=null;
        req.flash('success','退出成功');
        return res.redirect('/loginForm');
    })
    //发表文章逻辑
    app.post('/post',checkLogin);
    app.post('/post',function (req,res) {
        //获取当前登录成功的用户名的名字
        var currentUser=req.session.user.name;
        var title=req.body.title;
        var content=req.body.content;
        //发表文章的当前用户名
        var newpost=new Post(currentUser,title,content);
        newpost.save(function (err) {
            if(err){
                req.flash('error',err);
                return res.redirect('/main');
            }
            //发表文章成功
            req.flash('success','发表文章成功');
            return res.redirect('/main');
        })
    })
    /*************************************************/
    //main页面,可以显示文章等主要功能
    app.get('/main',checkLogin);
    app.get('/main',function (req,res) {
        //获取当前页面的参数值,是get请求
        var page=parseInt(req.query.p)||1;
        //设置name为空对象，将所有文章都搜索出来
        Post.get(null,page,function (err,docs,total) {
            if(err){
                docs=[];
            }
            //
            res.render('main',{
                title:'功能页面',
                user:req.session.user,
                error:req.flash('error').toString(),
                success:req.flash('success').toString(),
                texts:docs,
                total:total,
                page:page,
                //第一页
                FirstPage:(page-1)==0,
                //最后一页
                LastPage:(page-1)*10+docs.length==total
            })
        })
    })

    //删除一篇文章
    app.get('/delete/:name/:title/:second',checkLogin);
    app.get('/delete/:name/:title/:second',function (req,res) {
        var name=req.params.name;
        var title=req.params.title;
        var second=req.params.second;
        Post.delete(name,title,second,function (err) {
            if(err){
                req.flash('error',err);
                return res.redirect('/main');
            }
            //删除成功
            req.flash('success','删除成功');
            return res.redirect('/main');
        })
    })
    //编辑文章:先查找,再修改
    app.get('/edit/:name/:title/:second',checkLogin);
    app.get('/edit/:name/:title/:second',function (req,res) {
        var name=req.params.name;
        var title=req.params.title;
        var second=req.params.second;
        Post.getOne(name,title,second,function (err,doc) {
            if(err){
                doc={};
            }
            //查询一篇文章成功
            res.render('edit',{
                title:'编辑文章',
                user:req.session.user,
                success:req.flash('success').toString(),
                error:req.flash('error').toString(),
                doc:doc
            })
        })
    })

    //编辑文章的逻辑
    app.post('/edit/:name/:title/:second',checkLogin)
    app.post('/edit/:name/:title/:second',function (req,res) {
        var newcontent=req.body.content;
        var name=req.params.name;
        var title=req.params.title;
        var second=req.params.second;
        Post.edit(name,title,second,newcontent,function (err) {
            if(err){
                req.flash('error',err);
                //encodeURI是对url进行编码，使其进行重定向,es6的写法，这里虽然没出错，但是老出红线，看着非常不习惯，还是
                //我用字符串拼接吧
                //var url=encodeURI(`/edit/${name}/${title}/${second}`);
                var url=encodeURI('/edit/'+name+'/'+title+'/'+second);
                return res.redirect(url);
            }
            //更新成功，跳转到/main
            req.flash('success','更新文章成功');
            return res.redirect('/main');
        })
    })
    //上传文件,array的参数：input的name属性的值,上传的最大文件数量
    //进行单文件上传使用upload.single(input的name属性名)
   //upload.fields((input的name属性名)进行混合文件上传,single、array、fields都得小写，否则报错
    app.post('/upload',checkLogin);
    app.post('/upload',upload.array('uploadFile',5),function (req,res) {
       req.flash('success','文件上传成功');
       res.redirect('/main');
    });
    /*************************************************/
    //进行搜索获取文章，根据关键字进行匹配
    app.post('/main/username',function (req,res) {
        var keyword=req.body.keyword;
        //对url进行编码，这里这样写是为了解决搜索栏与查询整体内容在点击页数时冲突的问题
        //在重定向里一定要对url进行编码
        var url=encodeURI('/main/username/'+keyword);
        res.redirect(url);
    })
    //显示搜索内容
    app.get('/main/username/:keyword',function (req,res) {
        var newkeyword=req.params.keyword;
        //创建正则表达式的实例化
        //以全局进行搜索
        var reg=new RegExp(newkeyword,'g');
        var page=parseInt(req.query.p)||1;
        Post.get(reg,page,function (err,docs,total) {
            if(err){
                req.flash('error',err);
                return res.redirect('/main');
            }
            res.render('main',{
                title:'匹配搜索',
                user:req.session.user,
                success:req.flash('success').toString(),
                error:req.flash('error').toString(),
                texts:docs,
                total:total,
                page:page,
                //第一页
                FirstPage:(page-1)==0,
                //最后一页
                LastPage:(page-1)*10+docs.length==total
            });
        })
    })
    //进行评论
    app.get('/comment/:name/:title/:second',checkLogin);
    app.get('/comment/:name/:title/:second',function (req,res) {
        var name=req.params.name;
        var title=req.params.title;
        var second=req.params.second;
        //req.query.p获取的是字符串类型，所以要进行转换为整型
        var page=parseInt(req.query.p)||1;
        //显示评论
        Comment.get(name,title,second,page,function (err,coms,total) {
            if(err){
                coms=[];
            }
            res.render('comment',{
                title:'评论区',
                user:req.session.user,
                success:req.flash('success').toString(),
                error:req.flash('error').toString(),
                coms:coms,
                articleTitle:title,
                name:name,
                total:total,
                //第一页
                FirstPage:(page-1)==0,
                //最后一页
                LastPage:(page-1)*3+coms.length==total,
                //当前页数
                page:page
            })
        })
    })
    //评论的逻辑
    app.post('/comment/:name/:title/:second',checkLogin);
    app.post('/comment/:name/:title/:second',function (req,res) {
        var name=req.params.name;
        var username=req.session.user.name;
        var title=req.params.title;
        var second=req.params.second;
        var comment=req.body.commentText;
        var newComment=new Comment(name,username,title,second,comment);
        //将url进行编码，在redirect中使用,必须要进行url编码，否则不能使用
        var url=encodeURI('/comment/'+name+'/'+title+'/'+second);
        newComment.save(function (err) {
            if(err){
                req.flash('error',err);
                return res.redirect(url);
            }
            //保存成功
            req.flash('success','评论成功');
            return res.redirect(url);
        })
    });
    //删除评论的逻辑
    app.get('/remove/:name/:second',function (req,res) {
        //发表评论的人
        var name=req.params.name;
        //发表评论的时间
        var second=req.params.second;
        Comment.remove(name,second,function (err) {
            if(err){
                req.flash('error',err);
                return res.redirect('back');
            }
            //删除成功
            req.flash('success','删除评论成功');
            return res.redirect('back');
        })
    })
    //个人中心
    app.get('/u/:username',checkLogin);
    app.get('/u/:username',function (req,res) {
        var name=req.params.username;
        Perinfo.get(name,function (err,qms) {
            if(err){
                req.flash('error',err);
                var url=encodeURI('/u/'+name);
                return res.redirect(url);
            }
            //查询成功
            res.render('personal',{
                title:'个人中心',
                user:req.session.user,
                success:req.flash('success').toString(),
                error:req.flash('error').toString(),
                //获取签名的数组中的第一个(倒序、最新的)保存个性签名的人
                qm:qms[0]
            })
        })
    })


    //上传头像,upload.single:一次只能上传一张,里面是input[type='file']的name属性
    app.post('/u/:username',checkLogin);
    app.post('/u/:username',upload.single('uploadPhoto'),function (req,res) {
        // req.flash('success','上传头像成功');
        //使用redirect要对url进行编码
        var url=encodeURI('/u/'+req.params.username);
        return res.redirect(url);
    });

    //进行回复内容的操作
    app.post('/reply/:name/:title/:second',checkLogin);
    app.post('/reply/:name/:title/:second',function (req,res) {
        var reply=req.body.replyContent;
        var replyPeople=req.session.user.name;
        var name=req.params.name;
        var title=req.params.title;
        var second=req.params.second;
        Comment.reply(reply,replyPeople,name,title,second,function (err,com) {
            if(err){
                req.flash('error',err);
                return res.redirect('/main')
            }
            //返回上一级
            return res.redirect('back')
        })
    });

    /**
     *这里点赞、不点赞的功能有问题，我的思路主要是根据发布文章时的条件，在点赞时区更新发布文章时保存到zan、buzan两个属性的值
     */
    //点赞
    app.get('/zan',checkLogin);
    app.get('/zan',function (req,res) {
        //发表文章的用户名
        var name=req.query.name;
        var title=req.query.title;
        var second=req.query.second;
        Post.getzanOne(name,title,second,function (err,text) {
            if(err){
                req.flash('error',err);
                return res.redirect('/main')
            }
            //更新成功
            return res.send(text);
        })
    })
    //取消赞
    app.get('/buzan',checkLogin);
    app.get('/buzan',function (req,res) {
        //发表文章的用户名
        var name=req.query.name;
        var title=req.query.title;
        var second=req.query.second;
        Post.getbuzanOne(name,title,second,function (err,text) {
            if(err){
                req.flash('error',err);
                return res.redirect('/main');
            }
            //更新成功
            return res.send(text);
        })
    });

    //瞬间记忆
    app.get('/shunjianjiyi',function (req,res) {
        res.render('shunjian',{
            title:'瞬间记忆',
            user:req.session.user
        })
    })

    //
   app.post('/qianming',function (req,res) {
        var name=req.session.user.name;
        var qianming=req.body.qm;
        var info=new Perinfo(name,qianming);
        info.save(function (err) {
            if(err){
                req.flash('error',err);
                return res.redirect('back');
            }
            //保存成功
            var url=encodeURI('/u/'+name);
            return res.redirect(url);
        })
   })
    //心情信封
    app.get('/xinfeng/:name',function (req,res) {
        var name=req.params.name;
       User.get(name,function (err,user) {
           if(err){
               return req.flash('error',err);
               return res.redirect('back');
           }
           //查询成功
           res.render('perfectInfo',{
               title:'心情信封',
               user:user,
               success:req.flash('success').toString(),
               error:req.flash('error').toString()
           })
       })
    })
    //对信封里的信息进行保存
    app.post('/xinfeng',function (req,res) {
        var name=req.body.name;
        var email=req.body.email;
        var content=req.body.message;
        var xinfeng=new Xinfeng(name,email,content);
        xinfeng.save(function (err) {
            if(err){
                req.flash('error',err);
                return res.redirect('back');
            }
            //保存成功
            res.redirect('back');
        })
    })
    //完善个人资料
    app.get('/xiugai/:name',function (req,res) {
        var name=req.params.name;
        User.get(name,function (err,user) {
            if(err){
                req.flash('error',err);
                return res.redirect('back');
            }
            res.render('xiugai',{
                name:user.name,
                //密码通过md5加密过存储在数据库中，所以取出来会很长
                password:user.password,
                email:user.email
            })

        })
    })
    //完善个人资料
    app.post('/wanshan',function (req,res) {
        var name=req.body.name;
        var password=req.body.password;
        var email=req.body.email;
        var tel=req.body.tel;
        var gangwei=req.body.gangwei;
        var xueli=req.body.xueli;
        var yuexin=req.body.yuexin;
        var ruzhiDate=req.body.ruzhiDate;
        var wanshan=new Wanshan(name,password,email,tel,gangwei,xueli,yuexin,ruzhiDate);
        wanshan.save(function (err) {
            if(err){
                req.flash('error',err);
                return res.redirect('/main');
            }
            //保存成功
            var url=encodeURI('/u/'+req.session.user.name);
            res.redirect(url);
        })
    })
    //修改密码
    app.get('/mima/:name',function (req,res) {
        res.render('mima',{
            title:'修改密码',
            success:req.flash('success').toString(),
            error:req.flash('error').toString()
        });
    })

    app.post('/mima/:name',function (req,res) {
        var name=req.params.name;
       // 对密码进行加密
       var md5=crypto.createHash('md5');
       var newpassword=md5.update(req.body.tbPassword).digest('hex');
       if(newpassword==req.session.user.password){
           req.flash('error','密码未更改');
           var url=encodeURI('/mima/'+name);
           //这里的return会把前面的js代码也给阻止执行
           return res.redirect(url);
       }
        //进行更新密码操作
        User.update(name,newpassword,function (err,user) {
            if(err){
                req.flash('error','更新密码失败');
                var url=encodeURI('/mima/'+name);
                return res.redirect(url);
            }
            //更新密码成功
            //退出
            setTimeout(function () {
                //由于加了权限函数控制，所以要先退出才能回到登录页面
                req.session.user=null;
                return res.redirect('/loginForm')
            },3000);
        })
    })
    //浏览量
    app.get('/liulan',function (req,res) {
       var name=req.query.name;
       var second=req.query.second;
        console.log(name)
        console.log(second)
        Post.liulan(name,second,function (err,text) {
           if(err){
               req.flash('error',err);
               return res.redirect('back');
           }
           //更新成功
           return res.send(text);
       })
    })
    //最近登录用户
    app.get('/fangke',function (req,res) {
        Fangke.getAll(function (err,fangkes) {
            if(err){
                req.flash('error',err);
                return res.redirect('back');
            }
            res.render('fangke',{
                title:'最近登录用户',
                user:req.session.user,
                fangkes:fangkes
            });
        })
    })
    //最近心情日记
    app.get('/xinqingriji',function (req,res) {
        var name=req.session.user.name;
        Xinfeng.get(name,function (err,xinqings) {
            if(err){
                req.flash('error',err);
                return res.redirect('back');
            }
            //查询成功
            res.render('xinqingriji',{
                title:'心情日记',
                user:req.session.user,
                xinqings:xinqings
            })
        })
    })
    //我的个人资料
    app.get('/gerenziliao',function (req,res) {
        var name=req.session.user.name;
       Wanshan.get(name,function (err,wanshans) {
           if(err){
               req.flash('error',err);
               return res.redirect('back');
           }
           //查询成功
           res.render('gerenziliao',{
               title:'个人资料',
               user:req.session.user,
               //倒叙排列，取出最新的一个
               wanshan:wanshans[0]
           })

       })
    })
    //作者的详细资料
    app.get('/author/:name',function (req,res) {
       var name=req.params.name;
       Wanshan.get(name,function (err,wanshans) {
           if(err){
               req.flash('error',err);
               return res.redirect('back');
           }
           res.render('perAuthor',{
               title:name+'的个人资料',
               //倒叙排列，取出最新的一个
               wanshan:wanshans[0]
           })
       })
    })

}